Redshiftリサイズの進行状況をAWS CLIから確認する
西澤です。Redshiftを運用している中で、DB性能やディスク容量を確保する為、ノードタイプの変更やノード数の増強が必要となるケースがあると思います。今回は、AWS CLIからこのRedshiftリサイズを眺めてみることで、より多くの情報が取得できることがわかりましたのでご紹介したいと思います。
Redshiftのリサイズ
オンプレミス環境ではDB、ストレージと合わせると高価になりがちであったDWHが、Redshiftの登場により、多くのユーザから利用しやすくなったと思います。Redshiftの性能はノードタイプとそのノード数に依存しますが、事前に余裕を見たサイジングはしたとしても、コストメリットを活かす為には当然処理量やデータ量の増加に合わせて利用したいと考えると思います。格納されているデータを引き継ぐ形で行うストレージ変更が、Redshiftリサイズです。ただし、リサイズ中は接続断が発生し、データは全てReadOnlyになってしまいますので、全機能を提供できる状態とは言えません。詳しい説明は公式ドキュメントに任せるとして、今回問題とするのはそれに要する時間です。
サイズ変更オペレーションでは、データはコンピューティングノードまたはソースクラスターのノードから、コンピューティングノードまたはターゲットクラスターのノードに並列コピーされます。これに要する時間は、小さい方のクラスターにあるデータの量とノードの数によって異なります。数時間で終わることもあれば、2~3 日かかる可能性もあります。
チュートリアル: Amazon Redshift クラスターのサイズ変更 - Amazon Redshift
このリサイズにかかる時間を予測することは非常に困難で、公式ドキュメントでも数時間から2〜3日というかなり大雑把な指標しかありません。メンテナンスの為に確保する時間には十分に余裕を見ておくようにしましょう。
Redshiftのリサイズ中の進捗を確認したい
Redshiftリサイズに要する時間の事前見積が難しかったとしても、リサイズが開始された後であれば、終了までの目処がわかりそうなものです。そこで、まずはAWSマネージメントコンソールで確認してみました。下記画像は公式ドキュメントから拝借したものですが、リサイズ中はAWSマネージメントコンソールからその進捗状況を詳細に確認することができます。
- Resize Status(ステータス)
- Resize Process(進捗率)
- Average Rate of Transfer(平均転送量)
- Elapsed Time(経過時間)
- Remaining Time(残り時間)
ただ、このコンソールに表示されている値が必ずしも正確では無いケースがあったので、AWS CLIから何か他の情報が取れないかを確認してみることにしました。
AWS CLIからRedshiftリサイズを確認する
Redshiftのリサイズには、aws redshift describe-resize
コマンドを利用しました。
$ aws redshift describe-resize --cluster-identifier [clustename] { "Status": "IN_PROGRESS", "ImportTablesCompleted": [ "table_a", "table_b" ], "EstimatedTimeToCompletionInSeconds": 72782, "ProgressInMegaBytes": 157, "TargetClusterType": "single-node", "TotalResizeDataInMegaBytes": 12581, "ImportTablesNotStarted": [ "table_c", "table_d", "table_e", ], "AvgResizeRateInMegaBytesPerSecond": 0.1707, "ElapsedTimeInSeconds": 1317, "TargetNodeType": "ds2.xlarge" }
AWSマネージメントコンソールと比較すると、以下の項目が取得できているようです。
- テーブルのデータ移行状況
- ImportTablesNotStarted: データ移行開始前のテーブル一覧
- ImportTablesInProgress: データ移行中のテーブル一覧(コマンド上は確認できず)
- ImportTablesCompleted: データ移行完了のテーブル一覧
まずは、テーブルの移行状況が見えています。NotStarted -> InProgress -> Completedの順で遷移するようですが、実際にIn Progressとなっているものは取得できませんでした。全てのテーブルがImportTablesCompleted
に遷移した後、しばらくするとリサイズは完了しました。
- データ転送状況
- TotalResizeDataInMegaBytes(予想転送量:開始後に決定する固定値=?転送前の実データ量?)
- ProgressInMegaBytes(実転送量:進捗とともに増加する値)
続けて、データ転送状況についてです。この数値と経過時間を元に、残りの数値は決定されていると推測されます。ですので、TotalResizeDataInMegaBytes
が正確かどうかが問題になるのですが、この値は転送前の実データ量を示しているようです。しかし、実際にはノード数が変更となるケースやテーブルへのデータ格納状況により、リサイズ後のデータ量は変動することがあります。その為、画面上のProgressが99%なのになかなか終わらなかったり、50%だったものが急に完了したりするのではないかと思います。ひとまず、この2つの値を見比べることでより正確に進捗を確認できることがわかりました。
注意点としては、このコマンドの結果で取得できる情報も完全にリアルタイムでは無いという点です。実際には10秒おきにコマンドを実行し続けたのですが、徐々に情報が更新されるというよりは、AWSマネージメントコンソールと同程度の頻度で突然情報が更新されるような挙動となりました。
いずれにしても、AWSマネージメントコンソールからの情報よりも多くの情報を得られることがわかりました。終了までの時間を完全に予測することはできませんが、より多くの情報と実績値を組み合わせていけば、かなり正確に終了時刻を見積もることができるようになるのではないでしょうか?
リサイズ終了後の確認
aws redshift describe-resize
の素晴らしいところが、対象のRedshiftクラスタが有効な限りは、リサイズ完了後も前回の実行結果を取得できるところです。その後のリサイズ作業の参考値とする為、リサイズ実行結果を取得し、その情報を活用しましょう。一方で、AWSマネージメントコンソールでは、リサイズが終わると画面が切り替わってしまう為、実データ転送量や平均転送量等の値を後から確認することはできません(開始時刻、ReadOnlyになった時刻、完了時刻はイベント記録から参照可能です)。
まとめ
みんな大好きAWS CLIでより多くの情報が取得できることがわかりました。Redshiftのリサイズには、ある程度の時間を覚悟して臨みはするものの、進捗がわかりづらいと不安になりますよね。取れる情報は少しでも多いに越したことは無いので、ぜひ活用していただければと思います。
今後Redsfhitリサイズを予定されている方の参考となれば嬉しいです。